package com.etc

import org.apache.spark.ml.classification.LogisticRegression
import org.apache.spark.mllib.classification.LogisticRegressionWithLBFGS
import org.apache.spark.mllib.regression.LabeledPoint
import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.mllib.util.MLUtils
import org.apache.spark.rdd.RDD
import org.apache.spark.sql.{SQLContext, SparkSession}

/**
  * 使用逻辑回归做胃癌  转移  分类
  */
object LogisticRegressionTest {

  def main(args: Array[String]): Unit = {

    val conf = new SparkConf().setMaster("local").setAppName("logistic")
    val sc = SparkSession.builder().config(conf).getOrCreate()

    /**
      * 标注点LabeledPoint是一种带有标签（Label/Response）的本地向量，它可以是稠密或者是稀疏的。
      * 在MLlib中，标注点在监督学习算法中被使用。由于标签是用双精度浮点型来存储的，故标注点类型在回归
      * （Regression）和分类（Classification）问题上均可使用。例如，对于二分类问题，则正样本的标签为1，
      * 负样本的标签为0，而对于多类别的分类问题来说，标签则应是一个以0开始的索引序列:0, 1, 2 ...
      */
    val data:RDD[LabeledPoint] = MLUtils.loadLibSVMFile(sc.sparkContext,"wa.txt")


    //打印总数目
    print(s"data Count:${data.count}")

    val Array(traing,test) =  data.randomSplit(Array(0.8,0.2),2L)

    //打印训练数据数目
    print(s"training Count:${traing.count}")

    //打印测试数据数目
    print(s"test Count:${test.count}")

    //发现测试集和训练集并不一定按1：9的比例分

    //建立LogisticRegressionWithLBFGS对象，设置分类数 3 ，run传入训练集开始训练，返回训练后的模型
    val model = new LogisticRegressionWithLBFGS().setNumClasses(2).run(data)

    //使用训练后的模型对测试集进行测试，同时打印标签和测试结果
    val vectorsAndLabels= test.map{
      case LabeledPoint(l, f)=>{
        (l,model.predict(f))
      }
    }
    vectorsAndLabels.foreach(println)

  }
}





